package com.sumainfor.pc.gmio.service.impl;

import com.qiniu.util.Json;
import com.sumainfor.common.Constants;
import com.sumainfor.common.config.RedisUtils;
import com.sumainfor.common.entity.TemplateData;
import com.sumainfor.common.util.*;
import com.sumainfor.common.utlis.*;
import com.sumainfor.common.wechat.WeChatConfig;
import com.sumainfor.pc.gmio.dao.*;
import com.sumainfor.pc.gmio.feign.Zfeign.ZpcMktFeign;
import com.sumainfor.pc.gmio.feign.Zfeign.ZzuulFeign;
import com.sumainfor.pc.gmio.service.HoWithdrawalService;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 服务管家退租
 */
@Service
public class HoWithdrawalSerivceImpl implements HoWithdrawalService {

    private ReentrantLock lock = new ReentrantLock(false);
    Logger log = LoggerFactory.getLogger(HoWithdrawalSerivceImpl.class);
    @Autowired
    private HoWithdrawalMapper hoWithdrawalMapper;
    @Autowired
    private HoWithdrawalArticleMapper hoWithdrawalArticleMapper;
    @Autowired
    private HoWithdrawalEleMapper hoWithdrawalEleMapper;
    @Autowired
    private HoWithdrawalGasMapper hoWithdrawalGasMapper;
    @Autowired
    private HoWithdrawalNotpaidMapper hoWithdrawalNotpaidMapper;
    @Autowired
    private HoWithdrawalWaterMapper hoWithdrawalWaterMapper;
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private SeTenantBillMapper seTenantBillMapper;
    @Autowired
    private SeBillOutlayMapper seBillOutlayMapper;
    @Autowired
    private SeBillAbnormalMapper seBillAbnormalMapper;
    @Autowired
    private ZpcMktFeign zpcMktFeign;
    @Autowired
    private HoTenantBillMapper hoTenantBillMapper;
    @Autowired
    private HoEleMeterMapper hoEleMeterMapper;
    @Autowired
    private HoGasMeterMapper hoGasMeterMapper;
    @Autowired
    private HoWaterMeterMapper hoWaterMeterMapper;
    @Autowired
    private ZzuulFeign zzuulFeign;
    @Autowired
    private RedisUtils redisUtils;
    /**
     *服务管家查询入住期间退租的账单
     */
    public List<Map<String,Object>> getHoWithdrawalList(Map<String, Object> params){
        List<Map<String,Object>> list=hoWithdrawalMapper.getHoWithdrawalList(params);
        if (list==null){
            list=new ArrayList<Map<String,Object>>();
        }
        return list;
    }
    /**
     * 服务管家房源退租
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult addHoWithdrawal(Map<String,Object> params){
        System.out.println("params:"+params);
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if (params.get("openid")==null || params.get("ComName")==null || params.get("Address")==null
                        || params.get("PaId")==null || params.get("ProOperaType")==null || params.get("HouId")==null
                        || params.get("HouInfoId")==null || params.get("MiId")==null
                        || params.get("DelIdList")==null || params.get("InteDeviceList")==null ||  params.get("inteType")==null
                        ||params.get("ifIntelligentDevice")==null ){
                    return result.putFailed("参数不正确");
                }
                //退租总金额(取绝对值)
                BigDecimal TotalMoney=new BigDecimal(params.get("TotalMoney").toString()).abs();
                String userId=ContextUtils.getUserId();//当前登录人编号
                //退租主表编号
                String UUID="";
                Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                    put("uuid", "WitId");
                    put("database", Constants.DATA_SOURCE_GMIO);
                    put("surface", "tcgmio_withdrawal");
                }});
                System.out.println("uuid"+uuid);
                if(uuid!=null){
                    int number=Integer.valueOf(uuid.get("uuid").toString());
                    UUID= ComUtils.getLocalTrmSeqNum("te",number);
                }else{
                    UUID=ComUtils.getLocalTrmSeqNum("te",0);
                }
                params.put("WitId",UUID);//房源退租主表编号
                params.put("by", ContextUtils.getUserId());//操作人
                params.put("term", "4");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonInsertParms(params);
                params.put("StartingTime",params.get("instm"));//发起时间
                params.put("LaunchId",ContextUtils.getUserId());//发起人编号
                //正数收入 负数支出(退租结算生成账单);
                if (params.get("IfNumber").toString().equals("0")){//0 正数 1负数
                    params.put("IsIncome","0");//退租账单类型    0.唐巢收入    1.唐巢支出
                    //收入账单编号
                    String BiId="";
                    Map<String,Object>bid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "BiId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_tenant_bill");
                    }});
                    if(uuid!=null){
                        int number=Integer.valueOf(uuid.get("uuid").toString());
                        BiId= ComUtils.getLocalTrmSeqNum("te",number);
                    }else{
                        BiId=ComUtils.getLocalTrmSeqNum("te",0);
                    }
                    //组装 收入账单参数
                    Map<String,Object> map=new HashMap<String, Object>();
                    map.put("by", ContextUtils.getUserId());//操作人
                    map.put("term", "4");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    map.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(map);
                    map.put("BiId",BiId);//账单编号 UUID
                    map.put("CorId",params.get("CorId"));//当前账单归属公司
                    map.put("BiName","退租账单");//账单名称
                    map.put("IfTemporary",0);//是否是临时账单    0.否   1.是
                    map.put("BiType",6);//房租 2.公共事业费  3.维修费用  \n4.延期退审核  5.其他费用  6.退租账单
                    map.put("Source",UUID);//账单来源编号（根据账单类型退租账单主表编号）
                    map.put("FirstMon",0);//房租账单是否是首月    0否   1.是
                    map.put("PubType",0);//公共事业费的费用类型  0无  1.水费  2.电费  3.燃气\n只有账单类型为2才有
                    map.put("BiMoney",TotalMoney);//账单金额
                    map.put("BillExplain","费用合计:"+TotalMoney);//账单金额说明,多个逗号隔开
                    map.put("BiGenerated",params.get("instm"));//账单生成日
                    map.put("EndTime",params.get("instm"));//账单结束时间
                    map.put("LateDay",params.get("instm"));//账单最晚付款日
                    map.put("IfAdjust",0);//当前账单是否可以调整   0.否  1.是\n水电燃房租不可调整  类型 1-2
                    map.put("TenId",params.get("TenId"));//客户编号
                    map.put("HouId",params.get("HouId"));//房源主表编号
                    map.put("HouInfoId",params.get("HouInfoId"));//房源详表编号
                    map.put("Create",userId);//操作人
                    map.put("CreateType","2");//账单创建人类型  1.系统  2.人为
                    map.put("ExpStatus","0");//账单逾期状态   0.未逾期  1逾期   （超过最晚状态还未支付）
                    map.put("Status","1");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    map.put("Abnormal","0");//账单异常状态   0正常   1异常
                    Integer count=seTenantBillMapper.addTenantBill(map);
                    if (count<=0){
                        log.debug("退租账单异常--收入");
                        return result.putFailed("服务器繁忙");
                    }
                }else{
                    params.put("IsIncome","1");//退租账单类型    0.唐巢收入    1.唐巢支出
                    //唐巢支出账单
                    String BiOutId="";
                    Map<String,Object> boid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "BiOutId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_bill_outlay");
                    }});
                    if(uuid!=null){
                        int number=Integer.valueOf(uuid.get("uuid").toString());
                        BiOutId= ComUtils.getLocalTrmSeqNum("te",number);
                    }else{
                        BiOutId=ComUtils.getLocalTrmSeqNum("te",0);
                    }
                    //组装 支出账单参数
                    Map<String,Object> map=new HashMap<String, Object>();
                    map.put("by", ContextUtils.getUserId());//操作人
                    map.put("term", "4");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    map.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(map);
                    map.put("BiOutId",BiOutId);//账单编号 UUID
                    map.put("CorId",params.get("CorId"));//当前账单归属公司
                    map.put("BiOutName","退租账单");//账单名称
                    map.put("IfTemporary",0);//是否是临时账单    0.否   1.是
                    map.put("BiOutType",3);//账单类型  1.业主   2.供应商  3.退租账单   4.公共事业费    4.账单撤回
                    map.put("Relation",UUID);//账单来源编号（根据账单类型退租账单主表编号）
                    map.put("FirstMon",0);//房租账单是否是首月    0否   1.是
                    map.put("PubType",0);//公共事业费的费用类型  0无  1.水费  2.电费  3.燃气\n只有账单类型为2才有
                    map.put("BiMoney",TotalMoney);//账单金额
                    map.put("BillExplain","费用合计:"+TotalMoney);//账单金额说明,多个逗号隔开
                    map.put("StartTime",params.get("instm"));//账单生成日
                    map.put("EndTime",params.get("instm"));//账单结束时间
                    map.put("LateDay",params.get("instm"));//账单最晚付款日
                    map.put("IfAdjust",0);//当前账单是否可以调整   0.否  1.是\n水电燃房租不可调整  类型 1-2
                    map.put("StemType",3);//支出类型   1.业主  2.供应商  3.租客
                    map.put("StemId",params.get("TenId"));//客户编号 支出关联人编号，根据支出类型
                    map.put("HouId",params.get("HouId"));//房源主表编号
                    map.put("HouInfoId",params.get("HouInfoId"));//房源详表编号
                    map.put("Create",userId);//操作人
                    map.put("CreateType","2");//账单创建人类型  1.系统  2.人为
                    map.put("Create",params.get("insby"));//账单创建人 如果类型为系统，该字段为空
                    map.put("ExpStatus",0);//账单逾期状态   0.未逾期  1逾期   （超过最晚状态还未支付）
                    map.put("Status",1);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    Integer count=seBillOutlayMapper.addSeBillOutlay(map);
                    if (count<=0){
                        log.debug("退租账单异常--支出");
                        return result.putFailed("服务器繁忙");
                    }
                }
                //退租主表
                params.put("AuditId",ContextUtils.getUserId());//审核人
                params.put("AuditTime",params.get("instm"));//审核时间
                System.out.println("params"+params);
                hoWithdrawalMapper.addHoWithdrawal(params);
                //房源物品清单参数
                List<Map<String,Object>> artList=(List<Map<String,Object>>)params.get("articleList");
                System.out.println("artList"+artList);
                if(artList.size()>0) {
                    for (int i = 0; i < artList.size(); i++) {
                        Map<String, Object> artMap = artList.get(i);
                        artMap.put("WitId", params.get("WitId"));
                        artMap.put("HouId", params.get("HouId"));//房源主表编号
                        artMap.put("HouInfoId", params.get("HouInfoId"));//房源详表编号
                        artMap.put("OldAmount", artMap.get("ComNumber"));//房源原数量
                        artMap.put("RecyclingAmount", artMap.get("RealComNumber"));//回收数量（实际数量、不会大于原数量）
                        artMap.put("instm", params.get("instm"));
                        artMap.put("insterm", params.get("insterm"));
                        artMap.put("insby", params.get("insby"));
                        artMap.put("insfnc", params.get("insfnc"));
                        hoWithdrawalArticleMapper.addHoWithdrawalArticle(artMap);
                    }
                }
                /*******************如果是合租生产 水电燃账单**************************/
                if (String.valueOf(params.get("ProOperaType")).equals("1")){
                    //退租电费结算单
                    List<Map<String,Object>> eleList=(List<Map<String,Object>>)params.get("eleList");
                    //批次电表记录编号
                    String UUID2="";
                    //电表抄表编号
                    String UUID3="";
                    int number3=0;
                    Map<String,Object>uuid3=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "ElemeId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_ele_meter");
                    }});
                    if(uuid3!=null &&(!uuid3.get("uuid").toString().equals(""))){
                        number3=Integer.valueOf(uuid3.get("uuid").toString());
                    }
                    //账单支出编号
                    String UUID4="";
                    int number4=0;
                    Map<String,Object>uuid4=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "BiId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_tenant_bill");
                    }});
                    if(uuid4!=null &&(!uuid4.get("uuid").toString().equals(""))){
                        number4=Integer.valueOf(uuid4.get("uuid").toString());
                    }
                    UUID2=ComUtils.getLocalTrmSeqNum("ba",number4);//批次编号
                    Map<String,Object> HoMap=new HashMap<String,Object>();
                    HoMap.put("BatchId",UUID2);//抄表批次编号
                    HoMap.put("MeType","0");//来源类型  0.抄表   1.账单
                    HoMap.put("MeTypeId",UUID);//退租账单编号
                    HoMap.put("IfMeter","1");//是否是退租抄表   0.否  1.是
                    HoMap.put("by", ContextUtils.getUserId());//操作人
                    HoMap.put("Recorder",ContextUtils.getUserId());// 电表记录人编号
                    HoMap.put("IfGenerate",1);//是否生成账单  0.未生成  1.已生成',
                    HoMap.put("term", "4");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    HoMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(HoMap);
                    HoMap.put("BiType",2);// 1.房租 2.公共事业费  3.维修费用  \n4.延期退审核  5.其他费用  6.退租账单
                    HoMap.put("IfAdjust",0);//当前账单是否可以调整   0.否  1.是,
                    HoMap.put("CreateType","2");//账单创建人类型  1.系统  2.人为
                    HoMap.put("Create",ContextUtils.getUserId());//账单创建人
                    HoMap.put("Status",1);//账单状态   1.待支付  2.支付完成
                    HoMap.put("GenerateTime",HoMap.get("instm"));//账单生成日期
                    HoMap.put("BiGenerated",HoMap.get("instm"));//账单生成日期
                    HoMap.put("StaTime",HoMap.get("GenerateTime"));//账单周期--开始时间
                    HoMap.put("EndTime", ConvertDateTime.dateFormatTimeToStr(ConvertDateTime.FORMAT_ONLY_DATE_EN,ConvertDateTime.addDateTime(ConvertDateTime.getCurDate(),15,4)));//账单周期--结束时间
                    HoMap.put("LateDay",HoMap.get("EndTime"));//最晚付款时间
                    Calendar now = Calendar.getInstance();
                    int month= (now.get(Calendar.MONTH) + 1);
                    int num=0;
                    if (eleList.size()>0) {
                        for (Map<String, Object> arrMap : eleList) {
                            UUID3 = ComUtils.getLocalTrmSeqNum("em" + num, number3);//电表抄表记录编号
                            UUID4 = ComUtils.getLocalTrmSeqNum("zdzc" + num, number4);//支出账单编号
                            arrMap.putAll(HoMap);
                            arrMap.put("ElemeId", UUID3);
                            hoEleMeterMapper.addHoEleMeter(arrMap);
                            if (arrMap.get("TenId") == null || arrMap.get("TenId").toString().equals("")) {
                                continue;
                            }
                            //收入账单
                            arrMap.put("BiId", UUID4);
                            arrMap.put("BiName", month + "月份电费账单");
                            arrMap.put("BiMoney", arrMap.get("BillMoney"));//账单金额
                            arrMap.put("BiName", month + "月份电费账单");
                            arrMap.put("Source", UUID3);//来源编号
                            arrMap.put("BillExplain", "电费:" + arrMap.get("BiMoney") + ",均摊电量:" + arrMap.get("perELeSum"));
                            arrMap.put("PubType", 2);//1.水费  2.电费  3.燃气',
                            if (arrMap.get("TenId") != null && arrMap.get("IfOperaType").toString().equals("0") && !params.get("TenId").toString().equals(arrMap.get("TenId"))) {
                                seTenantBillMapper.addTenantBill(arrMap);
                            }
                            num++;
                        }
                    }
                    //退租燃气费结算单
                    //燃气抄表编号
                    String UUID5="";
                    int number5=0;
                    Map<String,Object>uuid5=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "GasmeId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_gas_meter");
                    }});
                    if(uuid5!=null &&(!uuid5.get("uuid").toString().equals(""))){
                        number5=Integer.valueOf(uuid5.get("uuid").toString());
                    }
                    Map<String,Object> gasData=(Map<String,Object>)params.get("gasData");
                    System.out.println("gasData"+gasData);
                    //获取各个房间的抄表数
                    List<Map<String,Object>> gasList=(List<Map<String,Object>>)gasData.get("gasList");
                    UUID5= ComUtils.getLocalTrmSeqNum("gm",number5);//燃气表抄表记录编号
                    gasData.put("GasmeId",UUID5);
                    gasData.putAll(HoMap);
                    hoGasMeterMapper.addHoGasMeter(gasData);

                    if (gasList.size()>0) {
                        for (int i = 0; i < gasList.size(); i++) {
                            UUID2 = ComUtils.getLocalTrmSeqNum("zdzc" + num, number4);//账单编号
                            Map<String, Object> billMap = gasList.get(i);
                            //收入账单
                            if (billMap.get("TenId") == null || billMap.get("TenId").toString().equals("")) {
                                continue;
                            }
                            billMap.putAll(HoMap);
                            billMap.put("BiGenerated", HoMap.get("instm"));//账单生成日期
                            billMap.put("BiId", UUID2);
                            billMap.put("BiName", month + "月份燃气账单");
                            billMap.put("Source", UUID5);//来源编号
                            billMap.put("BillExplain", "燃气费:" + billMap.get("BiMoney"));
                            billMap.put("PubType", 3);//1.水费  2.电费  3.燃气',
                            if (billMap.get("TenId") != null && !params.get("TenId").toString().equals(billMap.get("TenId"))) {
                                seTenantBillMapper.addTenantBill(billMap);
                            }
                            num++;
                        }
                    }
                    //退租水费结算单
                    String UUID6="";
                    int number6=0;
                    Map<String,Object>uuid6=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "WameId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_water_meter");
                    }});
                    if(uuid6!=null &&(!uuid6.get("uuid").toString().equals(""))){
                        number6=Integer.valueOf(uuid6.get("uuid").toString());
                    }
                    UUID6= ComUtils.getLocalTrmSeqNum("wm",number6);//水表抄表记录
                    Map<String,Object> waterData=(Map<String,Object>)params.get("waterData");
                    System.out.println("waterData"+waterData);
                    //获取各个房间的抄表数
                    List<Map<String,Object>> waterList=(List<Map<String,Object>>)waterData.get("waterList");
                    waterData.putAll(HoMap);
                    waterData.put("WameId",UUID6);
                    hoWaterMeterMapper.addHoWaterMeter(waterData);
                    if (waterList.size()>0) {
                        for (int i = 0; i < waterList.size(); i++) {

                            UUID2 = ComUtils.getLocalTrmSeqNum("zdzc" + num, number4);//账单编号
                            Map<String, Object> billMap = waterList.get(i);
                            if (billMap.get("TenId") == null || billMap.get("TenId").toString().equals("")) {
                                continue;
                            }
                            //收入账单
                            billMap.putAll(HoMap);
                            billMap.put("BiId", UUID2);
                            billMap.put("BiName", month + "月份水费账单");
                            billMap.put("BiType", "2");//账单类型  1.房租 2.公共事业费  3.维修费用  \n4.延期退审核  5.其他费用  6.退租账单
                            billMap.put("LateDay", HoMap.get("EndTime"));//最晚付款时间
                            billMap.put("EndTime", billMap.get("LateDay"));//账单结束时间 计算十五天之后的时间、
                            billMap.put("BiName", month + "月份水费账单");
                            billMap.put("Source", UUID6);//来源编号
                            billMap.put("BillExplain", "水费:" + billMap.get("BiMoney"));
                            billMap.put("PubType", 1);//1.水费  2.电费  3.燃气',
                            if (billMap.get("TenId") != null && !params.get("TenId").toString().equals(billMap.get("TenId"))) {
                                seTenantBillMapper.addTenantBill(billMap);
                            }
                            num++;
                        }
                    }
                }
                /*******************判断是否需要审核***********************************/
                if (params.get("Status").toString().equals("1")){//如果需要审核即审核时再去推送
                    //组装消息通知参数
                    Map<String,Object> messageMap=new HashMap<String,Object>();
                    messageMap.put("MeType","4");//4.市场部-服务中心经理
                    messageMap.put("Title","退租账单审核");//4.市场部-服务中心经理
                    messageMap.put("IfJump","0");//是否可以跳转页面 0.否 1.是
                    // messageMap.put("Neturl","4");//跳转URL（sys-sell/contact）
                    messageMap.put("by", "auto");//操作人
                    messageMap.put("term", "2");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    messageMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(messageMap);
                    messageMap.put("Content",messageMap.get("instm")+"注意！有新的退租账单待审核 请及时处理！");//4.市场部-服务中心经理
                    //去市场部新增消息通知
                    JsonResult zuulResult=zzuulFeign.addMessage(messageMap);
                    if (zuulResult.get("errorCode")!=null && !zuulResult.get("errorCode").toString().equals("0")){
                        return result.putFailed("服务器繁忙");
                    }
                    //账单异常记录
                    params.put("Abnor",1);//违约金异常类型  0无状态  1.租客违约   2.唐巢违约\n只有退租账单才有该编号
                    params.put("BillType","2");//账单异常分类   1.房租（合同）   2.退租账单
                    params.put("Source",params.get("PaId"));//账单异常来源编号（那一笔账单异常）
                    params.put("SysUserId",ContextUtils.getUserId());
                    seBillAbnormalMapper.addSeBill(params);
                    result.putSuccess("操作成功");
                }else{
                    //智能设备供应商     0 无智能门锁   2.科技侠   3.果加
                    if (params.get("inteType").toString().equals("2") || params.get("inteType").toString().equals("3")){
                        //需要删除密码的数据（删除蓝牙密钥）
                        List<Map<String,Object>> lockList=(List<Map<String,Object>>)params.get("DelIdList");
                        //保存钥匙编号（传递到市场部修改内部系统钥匙信息）
                        List<String> smaIdList=new ArrayList<String>();
                        System.out.println("lockList:"+lockList);
                        String DeviceLockToken="";//科技侠的登录token
                        String GuoJiaToken="";//果加的登录token
                        if (params.get("inteType").toString().equals("2")){//获取科技侠的登录token
                            DeviceLockToken=redisUtils.get("DeviceLockToken");
                            //如果获取不到就重新登录
                            if (DeviceLockToken==null){
                                Map<String,Object> tokenMap=new HashMap<String, Object>();
                                tokenMap.put("client_id",InteDeviceLockConfig.CLIENT_ID);
                                tokenMap.put("client_secret",InteDeviceLockConfig.CLIENT_SECRET);
                                tokenMap.put("grant_type",InteDeviceLockConfig.GRANT_TYPE_PASSWORD);
                                tokenMap.put("username",InteDeviceLockConfig.USERNAME);
                                tokenMap.put("password",InteDeviceLockConfig.PASSWORD);
                                tokenMap.put("redirect_uri",InteDeviceLockConfig.REDIRECT_URL);
                                System.out.println("请求科技侠的参数:"+tokenMap);
                                tokenMap=InteDeviceLockUtil.oauth2Token(tokenMap);
                                if (tokenMap.get("access_token")!=null){
                                    DeviceLockToken=tokenMap.get("access_token").toString();
                                    //token存到redis中
                                    redisUtils.set("DeviceLockToken",DeviceLockToken,Long.valueOf(tokenMap.get("expires_in").toString()));
                                }else{
                                    return result.putFailed("token获取失败");
                                }
                                Map<String,Object> lockMap=new HashMap<String,Object>();
                                lockMap.put("clientId", InteDeviceLockConfig.CLIENT_ID);
                                lockMap.put("accessToken",DeviceLockToken);
                                int lockNum=0;//保存删除成功的
                                for(Map<String,Object> map :lockList){
                                    smaIdList.add(map.get("SmaId").toString());//钥匙编号
                                    //智能设备供应商     2.科技侠   3.果加
                                    //密码类型   1.键盘密码  2.蓝牙密码
                                    if (map.get("CodeType").toString().equals("2")){
                                        lockMap.put("keyId",map.get("CodeId"));//密码id
                                        lockMap.put("date", InteDeviceLockUtil.getTimeSign());
                                        Map<String,Object> inteMap=InteDeviceLockUtil.keyDelete(lockMap);
                                        if(inteMap.get("errcode").toString().equals("0")){
                                            lockNum++;
                                        }
                                    }
                                }
                            }
                        }else if(params.get("inteType").toString().equals("3")) {//获取果加的登录token
                            GuoJiaToken=redisUtils.get("GuoJiaToken");
                            //如果获取不到就重新登录
                            if (GuoJiaToken==null){
                                Map<String,Object> guoJiaMap=new HashMap<String, Object>();
                                guoJiaMap.put("s_id",InteGuoJiaUtil.getSid());
                                guoJiaMap.put("version","1");
                                com.alibaba.fastjson.JSONObject bodyJson=new com.alibaba.fastjson.JSONObject();
                                //key
                                DESEncrypt desPlus2 = new DESEncrypt(InteGuoJiaConfig.DES_KEY);
                                //密码
                                bodyJson.put("account",InteGuoJiaConfig.ACCOUNT);
                                bodyJson.put("password",desPlus2.encrypt(InteGuoJiaConfig.PASSWORD));
                                guoJiaMap=InteGuoJiaUtil.login(guoJiaMap,bodyJson);
                                if (guoJiaMap.get("rlt_code") !=null && guoJiaMap.get("rlt_code").toString().equals("HH0000")){//HH0000 、成功
                                    //返回的token数据
                                    Map<String,Object>dataMap=(Map<String,Object>)guoJiaMap.get("data");
                                    GuoJiaToken=dataMap.get("access_token").toString();
                                    //token存到redis中
                                    redisUtils.set("GuoJiaToken",GuoJiaToken,Long.valueOf(dataMap.get("expires_second").toString()));
                                }else{
                                    return result.putFailed("token获取失败");
                                }
                            }
                            /*解除对用户的门锁授权*/
                            Map<String,Object> lockMap=new HashMap<String, Object>();
                            lockMap.put("s_id",InteGuoJiaUtil.getSid());
                            lockMap.put("version","1");
                            lockMap.put("access_token",GuoJiaToken);
                            com.alibaba.fastjson.JSONObject bodyJson=new com.alibaba.fastjson.JSONObject();
                            int lockNum=0;//保存删除成功的
                            for(Map<String,Object> map :lockList){
                                smaIdList.add(map.get("SmaId").toString());//钥匙编号
                                //智能设备供应商     2.科技侠   3.果加
                                bodyJson.put("lock_no",map.get("CodeId"));//这里相当于果加的智能设备编号
                                bodyJson.put("mobile",map.get("Code"));//这里相当于果加用户的手机号
                                System.out.println("果加传递lockMap:"+lockMap);
                                System.out.println("果加传递bodyJson:"+bodyJson);
                                Map<String,Object> inteMap=InteGuoJiaUtil.lockCancel_auth(lockMap,bodyJson);
                                System.out.println("果加返回inteMap:"+inteMap);
                                if(inteMap.get("rlt_code")!=null && inteMap.get("rlt_code").toString().equals("HH0000")){
                                    lockNum++;
                                }
                            }
                        }
                        //把已删除的智能钥匙编号传递到市场部
                        params.put("smaIdList",smaIdList);
                        //WitType 退租账单类型   1.租客违约   2.唐巢违约（唐巢违约不需要违约金）3租客正常退
                        //Withdrawal 退租状态   0.正常退租    1.强制退   2.违约退
                        if (String.valueOf(params.get("WitType")).equals("1")){
                            params.put("Withdrawal","2");
                        }else if (String.valueOf(params.get("WitType")).equals("3")){
                            params.put("Withdrawal","0");
                        }

                    }


                    //智能电表的数组
                    List<Map<String,Object>> InteDeviceList=(List<Map<String,Object>>)params.get("InteDeviceList");
                    System.out.println();
                    //如果智能电表数组不为空的就去执行大华or蜂电的退租操作
                    if (InteDeviceList.size()>0){
                        //智能设备供应商     0.蜂电   1.大华   2.科技侠   3.果加
                        if (params.get("ifIntelligentDevice").toString().equals("0")){
                            String InteDeviceBeeToken=redisUtils.get("InteDeviceBeeToken");
                            //如果获取不到就重新登录
                            if (InteDeviceBeeToken==null) {
                                Map<String, Object> tokenMap = new HashMap<String, Object>();
                                params.put("version","0116010101");//版本号 默认 0116010101
                                params.put("appid", InteDeviceBeeConfig.APP_ID);
                                tokenMap=InteDeviceBeeUtil.userLogin(InteDeviceBeeConfig.USERID, InteDeviceBeeConfig.PASS,params);
                                System.out.println("tokenMap："+tokenMap);
                                if (tokenMap.get("Code").toString().equals("0")) {
                                    InteDeviceBeeToken = tokenMap.get("Expand").toString();
                                    //token存到redis中 有效时长一个小时
                                    redisUtils.set("InteDeviceBeeToken", InteDeviceBeeToken,3600);
                                } else {
                                    return result.putFailed("token获取失败");
                                }
                            }
                            //蜂电接口请求头必传的参数
                            Map<String,Object> headMap=new HashMap<String,Object>();
                            headMap.put("uid",InteDeviceBeeConfig.UID);
                            headMap.put("token",InteDeviceBeeToken);
                            if (params.get("ProOperaType").toString().equals("1")) {//租赁类型（1.合租 2.整租）
                                for(Map<String,Object> conMap:InteDeviceList){
                                    //蜂电电表退租（如果是合租的租客）
                                    InteDeviceBeeUtil.deviceAmmeterConfirmrecederoom(conMap.get("Uuid").toString(),headMap);
                                }
                            }else if (params.get("ProOperaType").toString().equals("2")){
                                for(Map<String,Object> conMap:InteDeviceList){
                                    //智能设备UUID  模式0是后付费，1是预付费 请求头部信息
                                    //修改房间电表的付费模式
                                    InteDeviceBeeUtil.deviceAmmeterPaymode(conMap.get("Uuid").toString(),"1",headMap);
                                }
                            }
                        }
                    }
                    //去市场部修改合同的相关信息
                    JsonResult marketResult=zpcMktFeign.updatePactRent(params);
                    if (marketResult.get("errorCode")==null || !marketResult.get("errorCode").toString().equals("0")){
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return result.put("服务器繁忙");
                    }

                    Map<String, TemplateData> param = new HashMap<>();
                    param.put("first", new TemplateData("唐巢公寓温馨提示：尊敬的租客，退租提醒\n", "#4876FF"));
                    param.put("keyword1", new TemplateData(params.get("ComName").toString(), "#4876FF"));
                    param.put("keyword2", new TemplateData(params.get("Address").toString(), "#4876FF"));
                    param.put("keyword3", new TemplateData(params.get("instm").toString(), "#4876FF"));
                    param.put("keyword4", new TemplateData(params.get("instm").toString(), "#4876FF"));
                    Jsapi_ticketUtil.sendTemplate(params.get("openid").toString(),WeChatConfig.RENTPACT_ID,"http://www.4006269069.net/#/terminationDetail?PaId="+params.get("PaId"),"#4876FF", JSONObject.fromObject(param));
                    //修改账单为废弃
                    params.put("Source",params.get("PaId"));//账单来源编号
                    params.put("Status",4);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    params.put("delfg",1);//废弃标志位  0正常 1废弃
                    //未支付账单列表
                    if (param.get("notpaidList")!=null){
                        List<Map<String,Object>> notpaidList=(List<Map<String,Object>>)params.get("notpaidList");
                        for(Map<String,Object> noMap:notpaidList){
                            noMap.put("Status","4");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）5审核驳回
                            noMap.put("delfg","1");//废弃标志位  0正常 1废弃
                            noMap.put("by", userId);//操作人
                            noMap.put("term", "4");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                            noMap.put("fnc",
                                    this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                            ParamsCommon.commonUpdateParms(noMap);
                            noMap.put("Source",params.get("BiId"));
                            hoTenantBillMapper.updateHoStatusDelfg(noMap);
                        }
                    }
                    result.putSuccess("操作成功");
                }
            }catch (Exception e) {
                result.putFailed("服务器繁忙");
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }
    /*
     *服务管家根据退租主表编号查询房源的退租信息
     */
    public Map<String,Object> getHoWithdrawalByWitId(Map<String,Object> params){
        return hoWithdrawalMapper.getHoWithdrawalByWitId(params);
    }
    /**
     *租后主管查看退租账单详情
     */
    @Override
    public Map<String, Object> getHoWithdrawal(Map<String, Object> params) {
        return hoWithdrawalMapper.getHoWithdrawal(params);
    }
    /**
     *租后主管查询员工信息列表（服务管家和服务描述）
     */
    @Override
    public JsonResult getHokeeperStaffList(Map<String, Object> params) {
        params.put("role_id","10");//管家的编号
        JsonResult result=new JsonResult();
        //查询管家退租的数量
        List<Map<String,Object>> gmioList=hoWithdrawalMapper.getHoStaffList(params);
        System.out.println("运营部返回的值:"+gmioList);
        //查询网关里管家相关的数据
        JsonResult zuulResult=zzuulFeign.getSysDeptRoleList(params);
        System.out.println("网关返回的值:"+zuulResult);
        if(zuulResult.get("errorCode")==null || !zuulResult.get("errorCode").toString().equals("0")){
            return result.putFailed("服务器繁忙");
        }
        //网关的集合
        List<Map<String,Object>> zuulList=(List<Map<String,Object>>)zuulResult.get("result");
        //查询市场部里管家相关的数据
        JsonResult marketResult=zpcMktFeign.getRdStaffList(params);
        System.out.println("市场部返回的值:"+marketResult);
        if(marketResult.get("errorCode")==null || !marketResult.get("errorCode").toString().equals("0")){
            return result.putFailed("服务器繁忙");
        }
        //市场部的集合
        List<Map<String,Object>> marketList=(List<Map<String,Object>>)marketResult.get("result");
        for (Map<String,Object> map1:zuulList) {
            if (map1.get("user_id") != null) {
                for (Map<String, Object> map2 : marketList) {
                    if (map2.get("SysUserId") != null) {
                        if (String.valueOf(map1.get("user_id")).equals(String.valueOf(map2.get("SysUserId")))) {
                            System.out.println("比对成功");
                            map1.putAll(map2);
                        }
                    }
                }
            }
        }
        //和运营部的集合匹配
        for (Map<String,Object> map1:zuulList) {
            if (map1.get("user_id") != null) {
                for (Map<String, Object> map2 : gmioList) {
                    if (map2.get("LaunchId") != null) {
                        if (String.valueOf(map1.get("user_id")).equals(String.valueOf(map2.get("LaunchId")))) {
                            System.out.println("比对成功");
                            map1.putAll(map2);
                        }
                    }
                }
            }
        }
        if (zuulList!=null){
            result.put(zuulList);
        }else{
            result.putFailed("服务器繁忙");
        }
        return result;
    }
    /**
     *租后主管账单管理（常规退租客和违约退租客）
     */
    @Override
    public JsonResult getHoWithdList(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        if (params.get("pageno")==null || params.get("pagesize")==null || params.get("WitType")==null){
            return result.putFailed("参数不正确");
        }
        Pager pager=new Pager();
        pager.setPageno(Integer.parseInt(params.get("pageno").toString()));
        pager.setPagesize(Integer.parseInt(params.get("pagesize").toString()));
        pager.setPagerNecessary(params, pager);
        PageUtils pageUtils = new PageUtils();
        Integer cout=hoWithdrawalMapper.getHoWithdListCount(params);
        if(cout==0){
            return pageUtils.getJsonResult(new ArrayList<Map<String,Object>>(), params,cout);
        }
        List<Map<String,Object>>getCommunityList=hoWithdrawalMapper.getHoWithdList(params);
        List<String> paIdList=new ArrayList<String>();
        for (Map<String,Object> gmioMap:getCommunityList){
            if (gmioMap.get("PaId")!=null){
                paIdList.add(gmioMap.get("PaId").toString());
            }
        }
        params.put("paIdList",paIdList);
        JsonResult marketResult=zpcMktFeign.getRdRenewalTenInfoList(params);
        if (marketResult.get("errorCode")==null|| !marketResult.get("errorCode").equals("0")){
            return result.putFailed("服务器繁忙");
        }
        //市场部的集合
        List<Map<String,Object>> marketList=(List<Map<String,Object>>)marketResult.get("result");
        System.out.println("marketResult："+marketResult);
        for (Map<String,Object> map1:getCommunityList){
            if (map1.get("PaId")!=null){
                for (Map<String,Object> map2:marketList){
                    if (map2.get("PaId")!=null){
                        if (map1.get("PaId").toString().equals(map2.get("PaId").toString())){
                            map1.putAll(map2);
                        }
                    }
                }
            }
        }
        result=pageUtils.getJsonResult(getCommunityList, params, cout);
        return result;
    }
    /**
     * 根据合同编号查询该合同是否存在未审核的退租表
     */
    @Override
    public JsonResult getHoPactWithCount(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        if (params.get("PaId")==null){
            return result.putFailed("参数不正确");
        }
        Integer count=hoWithdrawalMapper.getHoPactWithCount(params);
        if (count!=null){
            result.put(count);
        }else{
            result.putFailed("服务器繁忙");
        }
        return result;
    }

}
